package com.legendframework.dao.wrapper.interfaces;

import java.io.Serializable;

/**
 * 查询条件封装
 * @param <C> 字段
 * @param <R> 返回值
 */
public interface Compare<C,R> extends Serializable {

    /**
     * 等于 =
     *
     * @param condition 执行条件
     * @param column    字段
     * @param val       值
     * @return R
     */
    R eq(boolean condition, C column, Object val);

    /**
     * ignore
     */
    default R eq(C column, Object val) {
        return eq(true, column, val);
    }


    /**
     * 不等于 &lt;&gt;
     *
     * @param condition 执行条件
     * @param column    字段
     * @param val       值
     * @return R
     */
    R ne(boolean condition, C column, Object val);

    /**
     * ignore
     */
    default R ne(C column, Object val) {
        return ne(true, column, val);
    }

    /**
     * 大于 &gt;
     *
     * @param condition 执行条件
     * @param column    字段
     * @param val       值
     * @return R
     */
    R gt(boolean condition, C column, Object val);

    /**
     * ignore
     */
    default R gt(C column, Object val) {
        return gt(true, column, val);
    }

    /**
     * 大于等于 &gt;=
     *
     * @param condition 执行条件
     * @param column    字段
     * @param val       值
     * @return R
     */
    R ge(boolean condition, C column, Object val);

    /**
     * ignore
     */
    default R ge(C column, Object val) {
        return ge(true, column, val);
    }

    /**
     * 小于 &lt;
     *
     * @param condition 执行条件
     * @param column    字段
     * @param val       值
     * @return R
     */
    R lt(boolean condition, C column, Object val);

    /**
     * ignore
     */
    default R lt(C column, Object val) {
        return lt(true, column, val);
    }

    /**
     * 小于等于 &lt;=
     *
     * @param condition 执行条件
     * @param column    字段
     * @param val       值
     * @return R
     */
    R le(boolean condition, C column, Object val);

    /**
     * ignore
     */
    default R le(C column, Object val) {
        return le(true, column, val);
    }

    /**
     * IN (值1,值2,...)
     * @param condition 执行条件
     * @param column    字段
     * @param vals      值集合
     * @return R
     */
    R in(boolean condition, C column, Object ... vals);

    /**
     * ignore
     */
    default R in(C column, Object ... val) {
        return in(true, column, val);
    }

    /**
     * NOT IN (值1,值2,...)
     * @param condition 执行条件
     * @param column    字段
     * @param vals      值集合
     * @return R
     */
    R notIn(boolean condition, C column, Object ... vals);

    /**
     * ignore
     */
    default R notIn(C column, Object ... val) {
        return notIn(true, column, val);
    }

    /**
     * LIKE '%值%'
     *
     * @param condition 执行条件
     * @param column    字段
     * @param val       值
     * @return R
     */
    R like(boolean condition, C column, Object val);

    /**
     * ignore
     */
    default R like(C column, Object val) {
        return like(true, column, val);
    }

    /**
     * NOT LIKE '%值%'
     *
     * @param condition 执行条件
     * @param column    字段
     * @param val       值
     * @return R
     */
    R notLike(boolean condition, C column, Object val);

    /**
     * ignore
     */
    default R notLike(C column, Object val) {
        return notLike(true, column, val);
    }

    /**
     * LIKE '%值'
     *
     * @param condition 执行条件
     * @param column    字段
     * @param val       值
     * @return R
     */
    R likeLeft(boolean condition, C column, Object val);

    /**
     * ignore
     */
    default R likeLeft(C column, Object val) {
        return likeLeft(true, column, val);
    }

    /**
     * LIKE '值%'
     *
     * @param condition 执行条件
     * @param column    字段
     * @param val       值
     * @return R
     */
    R likeRight(boolean condition, C column, Object val);

    /**
     * ignore
     */
    default R likeRight(C column, Object val) {
        return likeRight(true, column, val);
    }

    /**
     * IS NULL
     *
     * @param condition 执行条件
     * @param column 字段
     * @return R
     */
    R isNull(boolean condition, C column);

    /**
     * ignore
     */
    default R isNull(C column) {
        return isNull(true, column);
    }

    /**
     * IS NOT NULL
     *
     * @param condition 执行条件
     * @param column 字段
     * @return R
     */
    R isNotNull(boolean condition, C column);

    /**
     * ignore
     */
    default R isNotNull(C column) {
        return isNotNull(true, column);
    }

}
